package br.com.werp.regras.almoxarifado.integracao;

import br.com.werp.regras.geral.Debuger;
import br.com.werp.regras.geral.integracao.MasterDAO;
import br.com.werp.regras.geral.util.BeanUtil;
import br.com.werp.regras.geral.util.Constantes;
import br.com.werp.regras.geral.util.Dia;
import br.com.werp.regras.geral.vos.almoxarifado.MovimentacaoVO;
import br.com.werp.regras.geral.vos.tabelas.Ajuste;
import br.com.werp.regras.geral.vos.tabelas.Entrada;
import br.com.werp.regras.geral.vos.tabelas.Entrada_item;
import br.com.werp.regras.geral.vos.tabelas.Produto_empresa;
import br.com.werp.regras.geral.vos.tabelas.Saida;
import br.com.werp.regras.geral.vos.tabelas.Saida_item;

import java.sql.Connection;
import java.sql.ResultSet;

import java.util.ArrayList;
import java.util.List;


/**
 * @author Sobreira
 * Criado em 14/11/2005
 */
public class MovimentacaoDAO extends MasterDAO {
    private static final String QTDE_ENTRADA_PRODUTOS = "QTDE_ENTRADA_PRODUTOS";
    private static final String TOTAL = "TOTAL";
    private static final String QTDE_SAIDA_PRODUTOS = "QTDE_SAIDA_PRODUTOS";
    private static final String QTDE_AJUSTE_PRODUTOS = "QTDE_AJUSTE_PRODUTOS";
    private static MovimentacaoDAO movimentacaoDAO;

    private MovimentacaoDAO(String banco) throws Exception {
        super(banco);
    }

    public static MovimentacaoDAO getMovimentacaoDAO()
        throws Exception {
        if (movimentacaoDAO == null) {
            movimentacaoDAO = new MovimentacaoDAO(Constantes.BANCO);
        }

        return movimentacaoDAO;
    }

    public int obterQuantidadeEntradaProduto(Produto_empresa produto_empresa,
        Dia ateDia) throws Exception {
        return obterQuantidadeEntradaProduto(getConexao(), produto_empresa,
            ateDia);
    }

    public int obterQuantidadeEntradaProduto(Object object,
        Produto_empresa produto_empresa, Dia ateDia) throws Exception {
        return obterQuantidadeEntradaProduto((Connection) object,
            produto_empresa, ateDia);
    }

    public int obterQuantidadeEntradaProduto(Connection connection,
        Produto_empresa produto_empresa, Dia ateDia) throws Exception {
        String query = getQuery(QTDE_ENTRADA_PRODUTOS);

        try {
            query = query.replaceAll(P01,
                    String.valueOf(produto_empresa.getPrem_produto()));
            query = query.replaceAll(P02,
                    String.valueOf(produto_empresa.getPrem_id()));
            query = query.replaceAll(P03,
                    ateDia.getDataBanco());
            Debuger.debugar(query, this.getClass());

            ResultSet resultSet = connection.createStatement().executeQuery(query);

            if (resultSet.next()) {
                return resultSet.getInt(TOTAL);
            } else {
                return 0;
            }
        } finally {
            if (connection.getAutoCommit()) {
                liberaConeccao(connection);
            }
        }
    }

    public int obterQuantidadeSaidaProduto(Produto_empresa produto_empresa,
        Dia ateDia) throws Exception {
        return obterQuantidadeSaidaProduto(getConexao(), produto_empresa, ateDia);
    }

    public int obterQuantidadeSaidaProduto(Object object,
        Produto_empresa produto_empresa, Dia ateDia) throws Exception {
        return obterQuantidadeSaidaProduto((Connection) object,
            produto_empresa, ateDia);
    }

    public int obterQuantidadeSaidaProduto(Connection connection,
        Produto_empresa produto_empresa, Dia ateDia) throws Exception {
        String query = getQuery(QTDE_SAIDA_PRODUTOS);

        try {


            query = query.replaceAll(P01,
                    String.valueOf(produto_empresa.getPrem_produto()));
            query = query.replaceAll(P02,
                    String.valueOf(produto_empresa.getPrem_id()));
            query = query.replaceAll(P03,
                        ateDia.getDataBanco());
            Debuger.debugar(query, this.getClass());

            ResultSet resultSet = connection.createStatement().executeQuery(query);

            if (resultSet.next()) {
                return resultSet.getInt(TOTAL);
            } else {
                return 0;
            }
        } finally {
            if (connection.getAutoCommit()) {
                liberaConeccao(connection);
            }
        }
    }

    public int obterQuantidadeAjusteProduto(Produto_empresa produto_empresa,
        Dia ateDia) throws Exception {
        return obterQuantidadeAjusteProduto(getConexao(), produto_empresa,
            ateDia);
    }

    public int obterQuantidadeAjusteProduto(Object object,
        Produto_empresa produto_empresa, Dia ateDia) throws Exception {
        return obterQuantidadeAjusteProduto((Connection) object,
            produto_empresa, ateDia);
    }

    public int obterQuantidadeAjusteProduto(Connection connection,
        Produto_empresa produto_empresa, Dia ateDia) throws Exception {
        String query = getQuery(QTDE_AJUSTE_PRODUTOS);

        try {
            query = query.replaceAll(P01,
                    String.valueOf(produto_empresa.getPrem_produto()));
            query = query.replaceAll(P02,
                    String.valueOf(produto_empresa.getPrem_id()));
            query = query.replaceAll(P03,
                    ateDia.getDataBanco());
            Debuger.debugar(query, this.getClass());

            ResultSet resultSet = connection.createStatement().executeQuery(query);

            if (resultSet.next()) {
                return resultSet.getInt(TOTAL);
            } else {
                return 0;
            }
        } finally {
            if (connection.getAutoCommit()) {
                liberaConeccao(connection);
            }
        }
    }

    public List obterMovimentacaoEntrada(MovimentacaoVO movimentacaoVO,Dia inicio,Dia fim)
        throws Exception {
        Connection connection = getConexao();

        try {
            String tabelas = "entrada,entrada_item";
            String where = "entr_documento = etit_documento";

            if (movimentacaoVO.getEtit_mercadoria() != 0) {
                where += (" and etit_mercadoria=" +
                movimentacaoVO.getEtit_mercadoria());
            }

            if (inicio != null) {
                where += (" and etit_data_chegada >= " + inicio.getDataBanco());
            }

            if (fim != null) {
                where += (" and etit_data_chegada <= " + fim.getDataBanco23h());
            }
            
            List propridedadeExibiveis = new ArrayList();
            propridedadeExibiveis.addAll(BeanUtil.listarPropriedades(
                    new Entrada()));
            propridedadeExibiveis.addAll(BeanUtil.listarPropriedades(
                    new Entrada_item()));

            return preencheVO(connection, movimentacaoVO, tabelas, where,
                propridedadeExibiveis);
        } finally {
            liberaConeccao(connection);
        }
    }

    public List obterMovimentacaoSaida(MovimentacaoVO movimentacaoVO,Dia inicio,Dia fim)
        throws Exception {
        Connection connection = getConexao();

        try {
            String tabelas = "saida,saida_item";
            String where = "said_num = sdit_saida and said_status = 'A'";

            if (movimentacaoVO.getSdit_produto() != 0) {
                where += (" and sdit_produto=" +
                movimentacaoVO.getSdit_produto());
            }
            if (inicio != null) {
                where += (" and sdit_data_atendimento >= " + inicio.getDataBanco());
            }

            if (fim != null) {
                where += (" and sdit_data_atendimento <= " + fim.getDataBanco23h());
            }
            List propridedadeExibiveis = new ArrayList();
            propridedadeExibiveis.addAll(BeanUtil.listarPropriedades(
                    new Saida()));
            propridedadeExibiveis.addAll(BeanUtil.listarPropriedades(
                    new Saida_item()));

            return preencheVO(connection, movimentacaoVO, tabelas, where,
                propridedadeExibiveis);
        } finally {
            liberaConeccao(connection);
        }
    }

    public List obterMovimentacaoAjuste(MovimentacaoVO movimentacaoVO, Dia inicio, Dia fim)
        throws Exception {
        Connection connection = getConexao();

        try {
            String tabelas = "ajuste";
            String where = " 1=1 ";

            if (movimentacaoVO.getAjus_produto() != 0) {
                where += (" and ajus_produto =" +
                movimentacaoVO.getAjus_produto());
            }
            if (inicio != null) {
                where += (" and ajus_data >= " + inicio.getDataBanco());
            }

            if (fim != null) {
                where += (" and ajus_data <= " + fim.getDataBanco23h());
            }
            List propridedadeExibiveis = new ArrayList();
            propridedadeExibiveis.addAll(BeanUtil.listarPropriedades(
                    new Ajuste()));

            return preencheVO(connection, movimentacaoVO, tabelas, where,
                propridedadeExibiveis);
        } finally {
            liberaConeccao(connection);
        }
    }

    public static void main(String[] args) throws Exception {
        int cont = 0;

        try {
            while (true) {
                cont++;

                Connection connectio = getConexao();
                //liberaConeccao(connectio);
                System.out.println("==========>" + cont);
            }
        } catch (Exception e) {
            System.out.println(cont);
        }
    }
    
    public List pesquisarSaidas(Saida saida) throws Exception{
        Connection connection = getConexao();
        try {
            return pesquisarVO(connection, saida);
        } finally {
            liberaConeccao(connection);
        }
    }
}
